package com.administrator.customviewtest.view_group;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by Administrator on 2016/8/9.
 */
public class TestViewGroup1 extends ViewGroup {
    public TestViewGroup1(Context context) {
        this(context,null);
    }

    public TestViewGroup1(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public TestViewGroup1(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    //重写父类的该方法，返回MarginLayoutParams的实例，这样就为我们的ViewGroup指定了其LayoutParams为MarginLayoutParams。
    @Override
    public LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new MarginLayoutParams(getContext(),attrs);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        //计算childView的位置
        int cCount = getChildCount();

        int cWidth = 0;
        int cHeight = 0;
        MarginLayoutParams cParams = null;
        //遍历所有的childView根据其宽和高，以及margin进行布局
        for(int i=0;i<cCount;i++){
            View childView = getChildAt(i);
            cWidth = childView.getMeasuredWidth();
            cHeight = childView.getMeasuredHeight();
            cParams = (MarginLayoutParams) childView.getLayoutParams();

            int cl=0,ct=0,cr=0,cb = 0;

            switch (i){
                case 0:{
                    cl = cParams.leftMargin;
                    ct = cParams.topMargin;
                    break;
                }
                case 1:{
                    cl = getWidth()-cParams.rightMargin-cWidth-cParams.leftMargin;
                    ct = cParams.topMargin;
                    break;
                }
                case 2:{
                    cl = cParams.leftMargin;
                    ct = getHeight()-cParams.bottomMargin-cHeight-cParams.topMargin;
                    break;
                }
                case 3:{
                    cl = getWidth()-cParams.rightMargin-cWidth-cParams.leftMargin;
                    ct = getHeight()-cParams.bottomMargin-cHeight-cParams.topMargin;


                    break;
                }

            }
            cr = cl + cWidth;
            cb = cHeight + ct;
            childView.layout(cl, ct, cr, cb);
        }

    }

    /**
     * 计算所有ChildView的宽度和高度 然后根据ChildView的计算结果，设置自己的宽和高
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
        int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);

        //计算出所有的childview的宽和高
        measureChildren(widthMeasureSpec,heightMeasureSpec);

        int width = 0;
        int height = 0;

        int cCount = getChildCount();

        int cWidth = 0;
        int cHeight = 0;

        MarginLayoutParams cParams = null;

        //用于计算左边的两个childView的高度
        int lHeight = 0;
        //用于计算右边的两个chlldview的高度
        int rHeight = 0;

        //用于计算上边的两个childview的宽度
        int tWidth = 0;
        //用于计算下边的两个childview的宽度
        int bWidth = 0;
        //根据childview计算出的宽和高，以及设置的margin的计算容器的宽和高，主要用于容器是wrap_content时
        for(int i=0;i<cCount;i++)
        {
            View childView = getChildAt(i);
            cHeight = childView.getMeasuredHeight();
            cWidth = childView.getMeasuredWidth();
            cParams = (MarginLayoutParams) childView.getLayoutParams();

            //上面的两个childview
            if(i==0||i==1)
            {
                tWidth += cWidth+cParams.leftMargin+cParams.rightMargin;
            }
            if (i == 2 || i == 3)
            {
                bWidth += cWidth + cParams.leftMargin + cParams.rightMargin;
            }

            if (i == 0 || i == 2)
            {
                lHeight += cHeight + cParams.topMargin + cParams.bottomMargin;
            }

            if (i == 1 || i == 3)
            {
                rHeight += cHeight + cParams.topMargin + cParams.bottomMargin;
            }
        }
        width = Math.max(tWidth,bWidth);
        height = Math.max(lHeight,rHeight);

        //如果是wrap设置自己的  否则默认
        setMeasuredDimension(widthMode==MeasureSpec.EXACTLY?sizeWidth:width,heightMode==MeasureSpec.EXACTLY?
        sizeHeight:height);
    }




//        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
//        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
//
//        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
//        int sizeHeigh = MeasureSpec.getSize(heightMeasureSpec);
//
//
//        //计算出所有的childView的宽和高
//        measureChildren(widthMeasureSpec,heightMeasureSpec);
//
//        //记录如果死wrap_content 是设置的宽和高
//        int widht = 0;
//        int height = 0;
//        int cCount = getChildCount();
//
//        int cWidth = 0;
//        int cHeight = 0;
//        MarginLayoutParams cParams = null;
//
//        //用于计算左边两个childView的高度
//        int lHeight = 0;
//        //用于计算右边的两个chailView的高度,最终高度取二者之间的最大值
//        int rHeight = 0;
//
//        //用于计算上边的连个childView的宽度
//        int tWidth = 0;
//        //用于计算右边的两个childView的宽度，最终宽度取二者之间的最大值
//        int bWidth = 0;
//
//        //根据childView计算得出的宽和高，以及社会中margin计算容器的宽和高，主要用于容器是wrap_content是
//
//        for(int i=0;i>cCount;i++){
//            View childView = getChildAt(i);
//            cWidth = childView.getMeasuredWidth();
//            cHeight = childView.getMeasuredHeight();
//            cParams = (MarginLayoutParams) childView.getLayoutParams();
//
//            //上面的两个childView
//            if(i==0||i==1){
//                tWidth += cWidth+cParams.leftMargin+cParams.rightMargin;
//            }
//
//            if(i==2||i==3){
//                bWidth +=cWidth+cParams.leftMargin+cParams.rightMargin;
//            }
//            if (i == 0 || i == 2)
//            {
//                lHeight += cHeight + cParams.topMargin + cParams.bottomMargin;
//            }
//
//            if (i == 1 || i == 3)
//            {
//                rHeight += cHeight + cParams.topMargin + cParams.bottomMargin;
//            }
//
//        }
//
//
//    }
//        /**
//         * 获得此ViewGroup上级容器为其推荐的宽和高，以及计算模式
//         */
//        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
//        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
//        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
//        int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
//
//
//        // 计算出所有的childView的宽和高
//        measureChildren(widthMeasureSpec, heightMeasureSpec);
//        /**
//         * 记录如果是wrap_content是设置的宽和高
//         */
//        int width = 0;
//        int height = 0;
//
//        int cCount = getChildCount();
//
//        int cWidth = 0;
//        int cHeight = 0;
//        MarginLayoutParams cParams = null;
//
//        // 用于计算左边两个childView的高度
//        int lHeight = 0;
//        // 用于计算右边两个childView的高度，最终高度取二者之间大值
//        int rHeight = 0;
//
//        // 用于计算上边两个childView的宽度
//        int tWidth = 0;
//        // 用于计算下面两个childiew的宽度，最终宽度取二者之间大值
//        int bWidth = 0;
//
//        /**
//         * 根据childView计算的出的宽和高，以及设置的margin计算容器的宽和高，主要用于容器是warp_content时
//         */
//        for (int i = 0; i < cCount; i++)
//        {
//            View childView = getChildAt(i);
//            cWidth = childView.getMeasuredWidth();
//            cHeight = childView.getMeasuredHeight();
//            cParams = (MarginLayoutParams) childView.getLayoutParams();
//
//            // 上面两个childView
//            if (i == 0 || i == 1)
//            {
//                tWidth += cWidth + cParams.leftMargin + cParams.rightMargin;
//            }
//
//            if (i == 2 || i == 3)
//            {
//                bWidth += cWidth + cParams.leftMargin + cParams.rightMargin;
//            }
//
//            if (i == 0 || i == 2)
//            {
//                lHeight += cHeight + cParams.topMargin + cParams.bottomMargin;
//            }
//
//            if (i == 1 || i == 3)
//            {
//                rHeight += cHeight + cParams.topMargin + cParams.bottomMargin;
//            }
//
//        }
//
//        width = Math.max(tWidth, bWidth);
//        height = Math.max(lHeight, rHeight);
//
//        /**
//         * 如果是wrap_content设置为我们计算的值
//         * 否则：直接设置为父容器计算的值
//         */
//        setMeasuredDimension((widthMode == MeasureSpec.EXACTLY) ? sizeWidth
//                : width, (heightMode == MeasureSpec.EXACTLY) ? sizeHeight
//                : height);
//    }
}
